昨天吃午餐時手機跳了一個追蹤通知,然後我手殘把那位同學給刪掉了😱
如果你有看到的話我真的很抱歉rr
據說 Web 是許多人入門的領域(?),相較於其他領域而言,Web 相關的漏洞通常比較容易理解一點點,但是 Web 相關的手法相當多。除了常聽到的 SQLi、XSS 以外,CSRF、SSRF 以及任意上傳等等都屬於打 Web 會出現的手法,其他還有很多我也不太了解的類型,可以參考 CTF Wiki 的介紹。
今天會介紹 SQLi 的基本原理,接著明天是找題目來實際操作一次,那我們開始吧!
昨天的文章中有提到 OWASP Top 10 榜上有名的 Injection,SQLi 就是其中之一。
通常是使用者送的資料進到 Interpreter 前沒有經過過濾,而可以達到系統預期之外的操作。
系統上有段登入的 SQL query 如下:
username = input("請輸入 username: ")
password = input("請輸入 password: ")
sql_query = f"SELECT * FROM users WHERE username='{username}' AND password = '{password}'"
這是最直覺會寫出來的樣子,那會有什麼問題呢?
假設攻擊者在 username
中輸入了 admin' OR '1'='1
,帶入 query 會變成
SELECT * FROM users WHERE username = 'admin' OR '1'='1' AND password = '任意密碼'
由於 OR '1'='1'
這個陳述式會讓條件始終成立,使得攻擊者通過了身份驗證,並取得 admin
這個 user 的權限。雖然現實世界的情況往往沒有這麼簡單,但這個例子可以簡單理解 SQLi 是怎麼辦到的。
學習 SQLi 的時候發現看到的例子好像大多都是 SELECT 語句,我就查詢了一下如果是其他語句有什麼手法, 於是找到 PortSwigger 的這篇文章:SQL Injection in Different Statement Types,介紹得淺顯易懂,推薦大家也看看!